﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using JogoUno.carta;
using System.Net;
using System.IO;
using System.Web.Script.Serialization;
using JogoUno.dominio;
using System.Threading;

namespace JogoUno
{
    /// <summary>
    /// Interaction logic for Partida.xaml
    /// </summary>
    public partial class Partida : Window
    {

        private List<Jogador> jogadores = new List<Jogador>();
        List<Grid> gridsCartas = new List<Grid>();
        List<TextBlock> textsNomes = new List<TextBlock>();
        List<Rectangle> vez = new List<Rectangle>();

        private JogoStatus js;
        private Thread thread;


        public Partida()
        {
            InitializeComponent();
            gridsCartas.Add(cartasJogadorOponente1);
            gridsCartas.Add(cartasJogadorOponente2);
            gridsCartas.Add(cartasJogadorOponente3);

            textsNomes.Add(nomeJogadorOponente1);
            textsNomes.Add(nomeJogadorOponente2);
            textsNomes.Add(nomeJogadorOponente3);

            vez.Add(vezOponente1);
            vez.Add(vezOponente2);
            vez.Add(vezOponente3);
/*
            mostrarCartas();
           */
            if (MainWindow.lider) {

                string resposta = MainWindow.enviarMensagem("http://" + MainWindow.servidor + ":9000/uno/jogo/iniciar/" + MainWindow.nomeSala, "");
                if (resposta != null)
                {
                    JavaScriptSerializer json = new JavaScriptSerializer();
                    js = json.Deserialize<JogoStatus>(resposta);
                    atualizarPartida();
                }
            }
            else
            {
                string resposta = MainWindow.enviarMensagem("http://" + MainWindow.servidor + ":9000/uno/jogo/" + MainWindow.nomeSala, "");

                if (resposta != null)
                {
                    JavaScriptSerializer json = new JavaScriptSerializer();
                    js = json.Deserialize<JogoStatus>(resposta);
                    atualizarPartida();
                }
            }


            thread = new Thread(new ThreadStart(Notificacao));
            thread.Start();
        }




        public void Notificacao()
        {
            while (true)
            {
                //MainWindow.reader.ReadLine();
                // preencherJogadores();

                String notificacao = MainWindow.reader.ReadLine();

                if (notificacao != null && !notificacao.Equals(""))
                {
                    //MessageBox.Show(notificacao);
                    if (notificacao.Equals("jogo"))
                    {
                        string resposta = MainWindow.enviarMensagem("http://" + MainWindow.servidor + ":9000/uno/jogo/" + MainWindow.nomeSala, "");
                        if (resposta != null)
                        {
                            JavaScriptSerializer json = new JavaScriptSerializer();
                            js = json.Deserialize<JogoStatus>(resposta);

                            this.Dispatcher.Invoke(new Action<Partida>(j => this.atualizarPartida()), this);
                            //lbox_jogadores.Dispatcher.Invoke(new Action<List<Jogador>>(j => lbox_jogadores.ItemsSource = jogadores), jogadores);
                        }
                    }
                }

            }
        }



        private void atualizarPartida() {

            inicializarComponentes();

            List<Jogador> jogadores = js.jogadores;
            foreach (Jogador jogador in jogadores) {

                if (jogador.idJogador == MainWindow.jogador.idJogador)
                {
                    atualizarCartasJogador(cartasJogadorPrincipal, jogador, nomeJogadorPrincipal, vezPrincipal);
                }
                else {
                    atualizarCartasJogador(gridsCartas[0], jogador, textsNomes[0], vez[0]);
                    gridsCartas.RemoveAt(0);
                    textsNomes.RemoveAt(0);
                    vez.RemoveAt(0);
                }

                monteDisponivel.Children.Add(criarImagem("CartaPadrao.jpg", 10, 10));
                monteAmostra.Children.Add(criarImagem(js.cartaAmostra.getUrl(), 10, 10));
            }

        }

        private void atualizarCartasJogador(Grid grid, Jogador jogador, TextBlock nome, Rectangle vez) {
            int j = 0;

            string url = "";

            foreach (Carta carta in jogador.baralho.cartas)
            {

                if (jogador.idJogador == MainWindow.jogador.idJogador)
                {
                    url = carta.getUrl();
                }
                else
                {
                    url = "CartaPadrao.jpg";
                }

                j++;
                nome.Text = jogador.nome;
                
                Image img = criarImagem(url, 10 + (j * 50), 10);
                if (jogador.idJogador == MainWindow.jogador.idJogador) {
                    img.MouseUp += new MouseButtonEventHandler(img_MouseUp);
                }

                grid.Children.Add(img);
                vez.Visibility = Visibility.Visible;
                if (js.jogadorVez.idJogador == jogador.idJogador) {
                    vez.Fill = new SolidColorBrush(Colors.Green);
                } else {
                    vez.Fill = new SolidColorBrush(Colors.Red);
                }
            }

        }

        private Image criarImagem(String url, int x, int y) {

            Image img = new Image();
            img.Width = 50;
            img.Height = 100;
            img.Margin = new Thickness(x, y, 0, 0);
            img.HorizontalAlignment = HorizontalAlignment.Left;

            BitmapImage bitmap = new BitmapImage();
            bitmap.BeginInit();
           
            bitmap.UriSource = new Uri(@"Images/" + url, UriKind.RelativeOrAbsolute);
           
            bitmap.EndInit();
            img.Source = bitmap;

            return img;

        }

        void img_MouseUp(object sender, MouseButtonEventArgs e)
        {

            Image img = (Image) sender;
          
            
            string [] carta = ((BitmapImage)img.Source).UriSource.OriginalString.Split('/');
            string[] carta2 = carta[1].Split('.');

            string teste = "http://" + MainWindow.servidor + ":9000/uno/jogo/carta/" + MainWindow.jogador.idJogador + "/" + MainWindow.nomeSala + "/" + carta2[0] + "/" + "amarelo";
            MessageBox.Show(teste);

            string resposta = MainWindow.enviarMensagem("http://" + MainWindow.servidor + ":9000/uno/jogo/carta/" + MainWindow.jogador.idJogador + "/" + MainWindow.nomeSala + "/" + carta2[0] + "/" + "amarelo", "");
            if (resposta != null)
            {
                JavaScriptSerializer json = new JavaScriptSerializer();
                js = json.Deserialize<JogoStatus>(resposta);

                atualizarPartida();
            }

            
            //throw new NotImplementedException();
        }



        private void inicializarComponentes() {
            gridsCartas = new List<Grid>();
            textsNomes = new List<TextBlock>();
            vez = new List<Rectangle>();

            gridsCartas.Add(cartasJogadorOponente1);
            gridsCartas.Add(cartasJogadorOponente2);
            gridsCartas.Add(cartasJogadorOponente3);

            textsNomes.Add(nomeJogadorOponente1);
            textsNomes.Add(nomeJogadorOponente2);
            textsNomes.Add(nomeJogadorOponente3);

            vez.Add(vezOponente1);
            vez.Add(vezOponente2);
            vez.Add(vezOponente3);

            vezOponente1.Visibility = Visibility.Hidden;
            vezOponente2.Visibility = Visibility.Hidden;
            vezOponente3.Visibility = Visibility.Hidden;

            cartasJogadorPrincipal.Children.Clear();
            cartasJogadorOponente1.Children.Clear();
            cartasJogadorOponente2.Children.Clear();
            cartasJogadorOponente3.Children.Clear();


            cartasJogadorPrincipal.Children.Add(nomeJogadorPrincipal);
            cartasJogadorPrincipal.Children.Add(vezPrincipal);

            cartasJogadorOponente1.Children.Add(nomeJogadorOponente1);
            cartasJogadorOponente1.Children.Add(vezOponente1);

            cartasJogadorOponente2.Children.Add(nomeJogadorOponente2);
            cartasJogadorOponente2.Children.Add(vezOponente2);

            cartasJogadorOponente3.Children.Add(nomeJogadorOponente3);
            cartasJogadorOponente3.Children.Add(vezOponente3);


            nomeJogadorOponente1.Text = "";
            nomeJogadorOponente2.Text = "";
            nomeJogadorOponente3.Text = "";
        }

        private void mostrarCartas() {

            receberCartasOponente();

/*0,0 -> 100,0
50,0 -> 0,0
0,100 -> 100,50
*/



            for (int i = 0; i < jogadores.Count; i++) {

                Jogador jogador = jogadores[i];

/*                if (i == 0)
                {
//                    grauRotacao = 90;
 //                   largura = 0;
  //                  altura = 0;
                }
                else if (i == 1)
                {
                    grauRotacao = 180;
                    largura = 0;
                    altura = 0;
                } else if (i == 2) {
                    grauRotacao = 270;
                    largura = 0;
                    altura = 0;
                } else {
                    grauRotacao = 0;
                    largura = 0;
                    altura = 0;
                }
*/
                for (int j = 0; j < jogador.cartas.Count; j++)
                {

                    //usado para fazer rotação na imagem
//                    TransformedBitmap tb = new TransformedBitmap();

                    Image img = new Image();
                    img.Width = 50;
                    img.Height = 100;
                    img.Margin = new Thickness(10 + (j * 50), 10, 0, 0);
                    img.HorizontalAlignment = HorizontalAlignment.Left;

                    BitmapImage bitmap = new BitmapImage();
                    bitmap.BeginInit();
                    bitmap.UriSource = new Uri(@"Images/"+jogador.cartas[j].url, UriKind.RelativeOrAbsolute);
                    bitmap.EndInit();

                    //para fazer a rotação
/*                    tb.BeginInit();
                    tb.Source = bitmap;
                    RotateTransform transform = new RotateTransform(grauRotacao);
                    tb.Transform = transform;
                    tb.EndInit();
*/                    
                    //se não fosse rotacionar o source de 'img' receberia o 'bitmap'
                    img.Source = bitmap;

                    textsNomes[i].Text = jogador.nome;
                    gridsCartas[i].Children.Add(img);
                }

            }

        }

        private void button3_Click(object sender, RoutedEventArgs e)
        {
            //colocar a primeira carta,que foi retirada do monteDisponivel, depois colocar as cartas de descarte
        }

        private void testeCartas()
        {
            List<Grid> grids = new List<Grid>();
            grids.Add(cartasJogadorOponente1);
            grids.Add(cartasJogadorOponente2);
            grids.Add(cartasJogadorOponente3);

            for (int j = 0; j < grids.Count; j++)
            {
                for (int i = 0; i < 7; i++)
                {
                    //retirar a primeira carta e colocar em cima do monteJogado
                    Image img = new Image();
                    img.Width = 50;
                    img.Height = 100;
                    img.Margin = new Thickness(10 + (i * 50), 10, 0, 0);
                    img.HorizontalAlignment = HorizontalAlignment.Left;
                    //img.Source = "//JogoUno;component//Images//CartaPadrao.jpg";

                    BitmapImage bitmap = new BitmapImage();
                    bitmap.BeginInit();
                    bitmap.UriSource = new Uri(@"Images/CartaPadrao.jpg", UriKind.RelativeOrAbsolute);
                    bitmap.EndInit();
                    img.Source = bitmap;
                    grids[j].Children.Add(img);
                }
            }


        }

        private void button10_Click(object sender, RoutedEventArgs e)
        {

        }


       /* private List<Carta> receberCartasDoJogador() {

            JogoUno.carta.CartaNumerica c;
            return null;
        }*/

        private void receberCartasOponente() {

            for (int i = 0; i < 3; i++)
            {
                Jogador jog = new Jogador("Rafael");
                for (int j = 0; j < 7; j++ )
                {
                    jog.cartas.Add(new CartaVerso());
                }
                jogadores.Add(jog);
            }
        }

        private void btnDesistir_Click(object sender, RoutedEventArgs e)
        {
            string resposta = MainWindow.enviarMensagem("http://" + MainWindow.servidor + ":9000/uno/jogo/desistir/"+ MainWindow.jogador.idJogador +"/"+ MainWindow.nomeSala, "");
            if (resposta != null)
            {
                JavaScriptSerializer json = new JavaScriptSerializer();
                js = json.Deserialize<JogoStatus>(resposta);

                atualizarPartida();
            }

//            MainWindow main = (MainWindow)MainWindow.exibirJanela(MainWindow.JANELA_MAIN);
//            main.Show();
//            MainWindow.fechar(MainWindow.JANELA_PARTIDA);
            this.Close();
        }

        private void btnComprar_Click(object sender, RoutedEventArgs e)
        {
            string resposta = MainWindow.enviarMensagem("http://" + MainWindow.servidor + ":9000/uno/jogo/comprar/" + MainWindow.jogador.idJogador + "/" + MainWindow.nomeSala, "");
            if (resposta != null)
            {
                JavaScriptSerializer json = new JavaScriptSerializer();
                js = json.Deserialize<JogoStatus>(resposta);

                atualizarPartida();
            }
        }

        private void btnDesafiar_Click(object sender, RoutedEventArgs e)
        {
            string resposta = MainWindow.enviarMensagem("http://" + MainWindow.servidor + ":9000/uno/jogo/desafiar/" + MainWindow.jogador.idJogador + "/" + MainWindow.nomeSala, "");
            if (resposta != null)
            {
                JavaScriptSerializer json = new JavaScriptSerializer();
                js = json.Deserialize<JogoStatus>(resposta);

                atualizarPartida();
            }
        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            Menu menu = (Menu)MainWindow.exibirJanela(MainWindow.JANELA_MENU);
            menu.Show();
            MainWindow.fechar(MainWindow.JANELA_PARTIDA);
        }



      
    }
}
